package javaNIO1.buffer;


import java.nio.CharBuffer;

/**
 * Created with Intel IDEA.
 * 缓冲区
 * 基础属性： 位置position，标记mark， 上界limit , 容量capacity
 * @Auther: gjt
 * @Date: 2024/6/23 21:13
 */
public class buffer {

    public static void main(String[] args) {
        CharBuffer charBuffer = CharBuffer.allocate(100);
        char[] myArray = new char[100];

        //        while(fillBuffer(charBuffer)){
//            charBuffer.flip(); // 清空缓冲区
//            drainBuffer(charBuffer);
//            charBuffer.clear();
//        }
        flip(charBuffer);
//        compact(charBuffer);

//        markAndReset(charBuffer);
        clearBuf(charBuffer);
    }


    private static void drainBuffer (CharBuffer buffer)
    {
        while (buffer.hasRemaining( )) {
            System.out.print (buffer.get( ));
        }
        System.out.println ("");
    }
    private static boolean fillBuffer(CharBuffer buffer){
        if(index >= strings.length){
            return (false);
        }
        String string = strings[index++];
        for (int i = 0; i < strings.length; i++) {
            buffer.put(string.charAt(i));
        }
        return (true);
    }
    private static int index = 0;
    private static String [] strings = {
            "A random string value",
            "The product of an infinite number of monkeys",
            "Hey hey we're the Monkees",
            "Opening act for the Monkees: Jimi Hendrix",
            "'Scuse me while I kiss this fly", // Sorry Jimi ;-)
            "Help Me! Help Me!",
    };

    /**
     * 翻转: 就是讲上界设置成位置，之后将位置设置0
     */
    private static void flip(CharBuffer  buf){

        buf.put('r');
        buf.put('o');
        buf.put('o');
        buf.put('t');
        System.out.println(buf.position()+"位置"+buf.limit()+"上界,"+buf.capacity()+"容量");
//        buf.limit(buf.position()).position(0);
        buf.flip();
        System.out.println(buf.position()+"位置,"+ buf.limit()+"上界"+buf.capacity()+"容量");
    }

    /**
     * 释放：hasRemaining() 会告诉你是否已经到达了缓冲区的上界。
     *      remaining() 会告诉你位置到上界还有多少个元素
     * @param charBuffer
     * @param myArray
     */
    private static void release (CharBuffer charBuffer, char[] myArray){

        for (int i = 0; charBuffer.hasRemaining(); i++) {
            myArray[i] = charBuffer.get();
        }
        for (int i = 0; i < myArray.length; i++) {
            System.out.print(myArray[i]);
        }

    }

    /**
     * 压缩：就是把剩余没有读取的数据移动到缓冲区头部，上界回到容量的大小
     */
    private static void compact (CharBuffer charBuffer){

        for (int i = 0; i<=1; i++) {
            System.out.println(charBuffer.get());
        }
        charBuffer.compact();
        System.out.println("-------");
        for (int i = 0; charBuffer.hasRemaining(); i++) {
            System.out.println(charBuffer.get());
        }
    }


    /**
     * 标记：就是记录位置，之后可以回到这个位置
     * 相当于buffer.position(2).mark().position(4);
     */
    private static void markAndReset(CharBuffer charBuffer){
        charBuffer.mark();
        while(charBuffer.hasRemaining()){
            System.out.println(charBuffer.get());
        }
        charBuffer.reset();
        System.out.println(charBuffer.get()+"重置");
    }

    private static void clearBuf(CharBuffer charBuffer){
        charBuffer.clear();
        while(charBuffer.hasRemaining()){
            System.out.println("清楚缓冲区之后的"+charBuffer.get());
        }
    }

    /**
     *  两个缓冲区像相等的充要条件
     *  1. 两个对象类型相同，包含不同数据类型的buffer 不会相等，而buffer绝对不会等于非buffer对象
     *  2. 两个对象都剩余同样数量的元素，buffer 的容量不需要相同，而且缓冲区中剩余的数据索引也不必相同。但每个缓冲区中剩余元素的数目（从位置到上界）必须相同
     *  3. 在每个缓冲区中应被get()函数返回的剩余元素数据序列必须一致
     */
    /**
     * 缓冲区支持CompareTo()比较， 不允许不同对象进行比较。如果你传递一个错误对象它会抛出ClassCastException异常。 但是equals只会返回false ;
     * 比较是针对每个缓冲区内剩余数据进行的，直到不相等的元素被发现或者到达缓冲区的上界。如果一个缓冲区在不相等之前发现已经到达上界，则认为短的小于长的缓冲区
     */


}
